跳到主要内容

Linux 中拥塞控制和流量控制

1. 概念区分与整体架构

核心概念对比

生活化比喻

  • 流量控制:像家里的水龙头,接收端说"我的水桶快满了,你慢点放水"
  • 拥塞控制:像高速公路,发送端观察"路上车太多了,我要减速避免堵车"

2. TCP 窗口机制详解

窗口类型详解

3. 流量控制机制

滑动窗口原理

接收端缓冲区管理

实际场景示例

# 场景:文件下载服务器
# 客户端网络慢,服务器发送太快导致接收缓冲区满

# 查看TCP接收缓冲区配置
cat /proc/sys/net/ipv4/tcp_rmem
# 输出:4096 87380 6291456 (最小值 默认值 最大值)

# 查看连接的实际窗口大小
ss -i | grep -A1 "192.168.1.100:80"
# 输出:
# tcp ESTAB 0 0 192.168.1.10:45678 192.168.1.100:80
# cubic wscale:7,7 rto:201 rtt:1.5/0.75 ato:40 mss:1448
# rcvmss:1448 advmss:1448 cwnd:10 ssthresh:7 bytes_acked:1024
# bytes_received:2048 segs_out:8 segs_in:6 send:65.3Mbps

# 关键参数解释:
# cwnd:10 - 拥塞窗口10个MSS
# ssthresh:7 - 慢启动阈值
# send:65.3Mbps - 当前发送速率

4. 拥塞控制算法

TCP Reno 算法状态机

拥塞窗口变化图

真实测试示例

# 使用iperf3测试拥塞控制效果
# 终端1 (服务器)
iperf3 -s -p 5001

# 终端2 (客户端)
iperf3 -c 192.168.1.100 -p 5001 -t 60 -i 1

# 输出分析:
# [ 4] 0.00-1.00 sec 1.25 MBytes 10.5 Mbits/sec # 慢启动阶段
# [ 4] 1.00-2.00 sec 2.50 MBytes 21.0 Mbits/sec # 指数增长
# [ 4] 2.00-3.00 sec 5.00 MBytes 42.0 Mbits/sec # 继续增长
# [ 4] 3.00-4.00 sec 8.75 MBytes 73.4 Mbits/sec # 接近瓶颈
# [ 4] 4.00-5.00 sec 6.25 MBytes 52.4 Mbits/sec # 检测到拥塞,减速
# [ 4] 5.00-6.00 sec 7.50 MBytes 62.9 Mbits/sec # 拥塞避免阶段

# 同时监控拥塞控制状态
watch -n 1 'ss -i | grep 192.168.1.100'

5. Linux 拥塞控制算法对比

BBR vs Cubic 对比实验

# 查看当前拥塞控制算法
cat /proc/sys/net/ipv4/tcp_congestion_control
# 输出:cubic

# 查看可用算法
cat /proc/sys/net/ipv4/tcp_available_congestion_control
# 输出:reno cubic bbr

# 测试Cubic算法性能
echo cubic > /proc/sys/net/ipv4/tcp_congestion_control
iperf3 -c remote_server -t 30 -i 5
# 结果:平均 85 Mbits/sec,RTT 波动较大

# 切换到BBR算法
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control
iperf3 -c remote_server -t 30 -i 5
# 结果:平均 120 Mbits/sec,RTT 相对稳定

# BBR特别适合:
# 1. 高延迟网络 (如跨国网络)
# 2. 缓冲区膨胀严重的网络
# 3. 丢包率较高的无线网络

6. 实际问题排查与优化

网络性能问题诊断流程

典型问题场景

场景1:文件传输慢

# 问题现象:大文件传输速度很慢,明明带宽充足
# 诊断步骤:

# 1. 检查TCP窗口缩放
cat /proc/sys/net/ipv4/tcp_window_scaling
# 应该输出:1 (启用)

# 2. 检查接收缓冲区设置
cat /proc/sys/net/ipv4/tcp_rmem
# 默认:4096 87380 6291456
# 优化:4096 262144 16777216

# 3. 检查发送缓冲区
cat /proc/sys/net/ipv4/tcp_wmem
# 默认:4096 65536 4194304
# 优化:4096 262144 16777216

# 4. 实时监控连接状态
ss -i dst 192.168.1.100 | grep -E "cwnd|rtt|recv"

# 5. 优化配置
echo '4096 262144 16777216' > /proc/sys/net/ipv4/tcp_rmem
echo '4096 262144 16777216' > /proc/sys/net/ipv4/tcp_wmem

场景2:Web服务延迟高

# 问题:网站响应慢,特别是移动用户
# 分析:可能是拥塞控制算法不适合无线网络

# 1. 检查当前算法
cat /proc/sys/net/ipv4/tcp_congestion_control

# 2. 分析连接特征
ss -i | awk '/ESTAB/{print; getline; print}' | grep -A1 ":80"

# 3. 如果发现频繁的cwnd减小,考虑BBR
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control

# 4. 验证效果
curl -w "@curl-format.txt" -o /dev/null -s "http://example.com/large-file"
# curl-format.txt内容:
# time_namelookup: %{time_namelookup}\n
# time_connect: %{time_connect}\n
# time_appconnect: %{time_appconnect}\n
# time_pretransfer: %{time_pretransfer}\n
# time_redirect: %{time_redirect}\n
# time_starttransfer: %{time_starttransfer}\n
# time_total: %{time_total}\n

场景3:批量数据同步

# 问题:数据库同步工具传输大量数据时很慢
# 原因:默认配置不适合高吞吐场景

# 1. 针对高吞吐优化
echo 'net.ipv4.tcp_congestion_control = bbr' >> /etc/sysctl.conf
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_rmem = 4096 87380 134217728' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem = 4096 65536 134217728' >> /etc/sysctl.conf

# 2. 应用配置
sysctl -p

# 3. 应用层面优化 (MySQL为例)
# 在my.cnf中增加:
# slave_net_timeout = 600
# max_allowed_packet = 1G

7. 监控和可视化

监控脚本示例

#!/bin/bash
# tcp_monitor.sh - TCP连接监控脚本

LOGFILE="/var/log/tcp_monitor.log"
INTERVAL=5

while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# 获取连接统计
CONNECTIONS=$(ss -s | grep TCP | awk '{print $2}')

# 获取拥塞控制信息
ss -i | grep -E "(ESTAB|cubic|bbr|rtt|cwnd)" | while read line; do
if [[ $line == *"ESTAB"* ]]; then
CONNECTION=$line
else
echo "[$TIMESTAMP] $CONNECTION -> $line" >> $LOGFILE
fi
done

sleep $INTERVAL
done

性能可视化图表

总结

关键要点记忆

  1. 流量控制 = 保护接收端,防止缓冲区溢出
  2. 拥塞控制 = 保护网络,防止整体性能下降
  3. 实际发送速率 = min(拥塞窗口, 接收窗口)
  4. BBR算法 适合高延迟、高丢包率场景
  5. 监控重点:cwnd变化、RTT波动、重传率

实践建议

  • 开发环境:使用默认配置即可
  • 生产环境:根据网络特征选择拥塞控制算法
  • 跨地域传输:优先考虑BBR算法
  • 内网高速传输:调大缓冲区设置
  • 监控告警:关注RTT突增和重传率异常

记住:拥塞控制和流量控制是TCP可靠传输的两大支柱,理解它们的工作原理有助于解决各种网络性能问题!